import { getPeriodEndDate } from "@/utils";
import dayjs from "dayjs";

/**
 * 计算两个时间戳之间的节假日天数
 * @param {number} startTs - 开始时间戳（毫秒）
 * @param {number} endTs - 结束时间戳（毫秒）
 * @param {number[]} holidays - 节假日时间戳数组（毫秒）
 * @returns {number} 节假日天数
 */
export function getHolidayCount(start, end, holidays) {
  let count = 0;

  const startTime = dayjs(start).valueOf();
  const endTime = dayjs(end).valueOf();

  for (const ts of holidays) {
    if (ts >= startTime && ts <= endTime) count++;
  }
  return count;
}

/**
 * 获取拟定施工时间
 * @param plans 拟定列表
 * @param holidays 假日列表，存在就需要排除假日
 * @returns
 */
export function getPlanDate(plans: any[], holidays?: number[]) {
  // 筛选施工计划
  const unixs = plans
    .filter((e) => !e.notIncludedPeriod)
    .map((e) => [
      dayjs(e.planStartDate).valueOf(),
      dayjs(e.planFinishDate).valueOf(),
    ])
    .flat();

  const flag = unixs.length > 0;
  const min = flag ? Math.min(...unixs) : 0;
  const max = flag ? Math.max(...unixs) : 0;

  // 获取到结束时间到开始时间的总时长
  const duration =
    min > 0 && max > 0 ? dayjs(max).diff(dayjs(min), "day") + 1 : 0;

  // 计算实际施工时间：isSkipHoliday===true ? 小于totalPeriod : 与totalPeriod一样
  const actualDuration =
    duration - (holidays ? getHolidayCount(min, max, holidays) : 0);


    console.log("====duration",duration, max, min, actualDuration);

  return {
    duration,
    actualDuration,

    start: min > 0 ? dayjs(min).format("YYYY-MM-DD") : "",
    end: max > 0 ? dayjs(max).format("YYYY-MM-DD") : "",
  } as const;
}

/**
 * 根据合同和假日信息计算周期
 * @param plandBeginDate 合同开始时间
 * @param contractDuration 合同周期
 * @param holidays 假日列表
 * @param isSkipHoliday 假日是否施工
 * @returns
 */
export function getConstractDate(
  plandBeginDate,
  contractDuration: number,
  holidays: number[],
  isSkipHoliday: boolean
) {
  if (plandBeginDate) {
    const start = dayjs(plandBeginDate);

    const end = getPeriodEndDate(
      start.startOf("day"),
      contractDuration!,
      holidays,
      isSkipHoliday
    );

    // 假期不施工？根据计算时间-开始时间 ：contractDuration
    const duration = isSkipHoliday
      ? end.diff(start, "day") + 1
      : contractDuration;

    return {
      // 结束时间
      end,
      // 开始时间
      start,

      endText: end.format("YYYY-MM-DD"),
      startText: start.format("YYYY-MM-DD"),

      duration,
      // 把contractDuration始终当作实际施工周期
      actualDuration: contractDuration,
    };
  }
}
